package com.gradumate.client;

import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.gradumate.shared.Gebruiker;
import com.gradumate.shared.OpleidingPerFaculteitOverzicht;

/**
 * Klasse waarin vaak gebruikte elementen aangemaakt worden zoals buttons en headers
 * @author IJsbrand
 *
 */
public class Element {

	// Bevat de locatie vanaf de server waar de icons staan.
	private String iconStore = "style/icon/";
	
	/**
	 * @return Button met een pijl naar rechts.
	 */
	public Button getVolgendeButton() {
		return this.getButton("Volgende", "Volgende", "arrow_right.png");
	}
	
	/**
	 * @return Button met een floppydisk.
	 */
	public Button getOpslaanButton() {
		return this.getButton("Opslaan", "Opslaan", "disk.png");
	}
	
	/**
	 * @return Label met die voor een lege regel in een FlexTable zorgt.
	 */
	public Label getSpacer() {
		Label spacer = new Label(" ");
		spacer.setHeight("10px");
		spacer.setWidth("25px");
		return spacer;
	}
	
	/**
	 * @return Label met een image erin die als header dient voor het indienen van het afstudeervoorstel
	 */
	public Label getAfstudeerVoorstelIndienenHeader() {
		return this.getHeaderLabel("Afstudeervoorstel Indienen");
	}
	
	/**
	 * Maakt een label aan die boven de pagina geplaats kan worden
	 * @return Label met tekst
	 */
	public Label getHeaderLabel(String txt) {
		Label l = this.getLabel(txt);
		l.setHeight("30px");
		l.setStyleName("titel");
		return l;
	}
	
	/**
	 * Maakt een label aan die als subheader in een datatable kan worden gebruikt.
	 * @param String txt
	 * @return Label met de tekst
	 */
	public Label getH2Label(String txt) {
		Label l = this.getLabel(txt);
		l.setHeight("15px");
		l.setStyleName("titleH2");
		return l;
	}
	
	/**
	 * @param String met tekst voor op Label
	 * @return Label met txt
	 */
	public Label getLabel(String txt) {
		return new Label(txt);
	}
	/**
	 * Maakt een Button object aan en stuurt deze terug
	 * 
	 * @param btnTxt
	 *            bevat de tekst op de Button
	 * @param imgAlt
	 *            bevat de altText van de image op de button
	 * @param imgFile
	 *            is de bestands naam van de image
	 * @return Button met image
	 */
	public Button getButton(String btnTxt, String imgAlt, String imgFile) {
		return new Button(btnTxt + " " + this.getImage(imgAlt, imgFile).toString());
	}
	
	/**
	 * @param String imgAlt alternatieve tekst voor de image
	 * @param String imgFile bestandsnaam van de icon
	 * @return Image met icon en text.
	 */
	public Image getImage(String imgAlt, String imgFile) {
		Image img = new Image();
		img.setAltText(imgAlt);
		img.setUrl(this.iconStore + imgFile);
		
		return img;
	}
	
	/**
	 * Maakt een ListBox object aan waarin alle GebruikerType staan.
	 * @return ListBox
	 */
	public ListBox getGebruikerTypeListBox() {
		ListBox lstGebruikerType = new ListBox();
		lstGebruikerType.addItem("Selecteer een gebruikertype", Integer.toString(0));
		lstGebruikerType.addItem("Student", Integer.toString(Gebruiker.TYPE_STUDENT));
		lstGebruikerType.addItem("Afstudeeradministratie", Integer.toString(Gebruiker.TYPE_AFSTUDEER_ADMINISTRATIE));
		//lstGebruikerType.addItem("Afstuurcommissie voorzitter", Integer.toString(Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER));
		lstGebruikerType.addItem("Afstudeercommissie lid", Integer.toString(Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID));
		//lstGebruikerType.addItem("Afstudeercoordinator", Integer.toString(Gebruiker.TYPE_AFSTUDEER_COORDINATOR));
		lstGebruikerType.addItem("Studieadviseur", Integer.toString(Gebruiker.TYPE_STUDIE_ADVISEUR));
		lstGebruikerType.addItem("Teamleider personeelszaken", Integer.toString(Gebruiker.TYPE_TEAMLEIDER_PERSONEELSZAKEN));
		return lstGebruikerType;
	}
	
	/**
	 * Haalt een loading gif op.
	 * @return Image
	 */
	public Image getLoadingGif() {
		return this.getImage("Laden..", "ajax-loader.gif");
	}
	
	/**
	 * Maakt eeb Label aan met een stylesheet depend 
	 * @param String txt die op het Label komt
	 * @return Label met aangegeven tekst en stylesheet.
	 */
	public Label getDataTableHeaderLabel(String txt) {
		Label lbl = getLabel(txt);
		lbl.setStyleName("datatableHeader");
		return lbl;
	}
	
	/**
	 * Maakt een FLexTable aanwaarin een foutmelding staat
	 * @param String met bericht
	 * @return FlexTable met bericht
	 */
	public FlexTable errorTable(String msg) {
		FlexTable errorMsg = statusTable(msg);
		errorMsg.setStyleName("error");
		return errorMsg;
	}
	
	/**
	 * Maakt een FLexTable aanwaarin een geluktbericht staat
	 * @param String met bericht
	 * @return FlexTable met bericht
	 */
	public FlexTable successTable(String msg) {
		FlexTable succesMsg = statusTable(msg);
		succesMsg.setStyleName("success");
		return succesMsg;
	}
	
	/**
	 * Maakt een FlexTable aan waarin een informatie melding word getoond
	 * @param String met bericht msg
	 * @return FlexTable met daarin het bericht
	 */
	public FlexTable informationTable(String msg) {
		FlexTable informationMsg = statusTable(msg);
		informationMsg.setStyleName("information");
		return informationMsg;
	}
	
	/**
	 * Maakt een FlexTable aan met daarin een bericht
	 * @param String met bericht
	 * @return FlexTable met bericht
	 */
	private FlexTable statusTable(String msg) {
		FlexTable statusMsg = new FlexTable();
		statusMsg.setWidget(0, 0, new Label(msg));
		return statusMsg;
	}
	
	/**
	 * Stuurt een ListBox terug met daarin alle faculteiten van de HU
	 * @return ListBox met alle faculteiten
	 */
	public ListBox getListBoxFaculteiten() {
		OpleidingPerFaculteitOverzicht opfo = new OpleidingPerFaculteitOverzicht();
		
		ListBox lstFaculteiten = new ListBox();
		lstFaculteiten.addItem("Selecteer een faculteit", "");
		for (String faculteit : opfo.getFaculteiten()) {
			lstFaculteiten.addItem(faculteit);
		}
		return lstFaculteiten;
	}
}
